import axios from 'axios'
import axiosRetry from 'axios-retry'
import { showToast } from 'vant'

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.DEV ? '/proxy_douguo' : 'https://douguo.chaihongjun.me/proxy_douguo',
  timeout: 5000, // 请求超时时间
})

// 配置重试
axiosRetry(service, {
  retries: 3, //重试3次
  retryDelay: (retryCount) => (retryCount + 1) * 2000, // 延迟 2s/4s/6s
  shouldResetTimeout: true, //axios每次请求可以用的时间 都是timeout
  retryCondition: (error) => {
    // 1. 超时或网络断开
    if (error.code === 'ECONNABORTED' || !error.response) return true
    // 2. 仅重试服务器错误 (5xx)
    return error.response.status >= 500
  },
})

// 请求拦截器
service.interceptors.request.use(
  //(config) => {
  // 在发送请求之前做些什么，例如添加token
  // const token = localStorage.getItem('token');
  // if (token) {
  //   config.headers.Authorization = `Bearer ${token}`;
  // }
  (config) => {
    // 输出API调用信息
    if (import.meta.env.DEV && config.apiName) {
      console.log(`api:${config.apiName}`)
    }

    return config
  },
  (error) => {
    // 对请求错误做些什么
    console.error('Request Error:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 对响应数据做点什么
    let data = response.data

    // 添加 Unicode 解码逻辑
    if (typeof data === 'string') {
      try {
        // 尝试解析包含 Unicode 转义序列的字符串
        data = JSON.parse(JSON.stringify(data))
      } catch (e) {
        // 如果解析失败，保持原始数据
        console.warn('Unicode 解码失败:', e)
      }
    } else if (typeof data === 'object' && data !== null) {
      // 递归处理对象中的字符串字段
      const decodeObject = (obj) => {
        if (typeof obj === 'string') {
          try {
            return JSON.parse(`"${obj}"`)
          } catch (e) {
            return obj
          }
        } else if (Array.isArray(obj)) {
          return obj.map(decodeObject)
        } else if (typeof obj === 'object' && obj !== null) {
          const decoded = {}
          for (const key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key)) {
              decoded[key] = decodeObject(obj[key])
            }
          }
          return decoded
        }
        return obj
      }
      data = decodeObject(data)
    }

    return data
  },
  (error) => {
    // 对响应错误做点什么
    let errorMessage = '请求失败，请稍后再试'
    if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
      errorMessage = '请求超时，请检查网络连接或稍后再试'
    } else if (error.response) {
      switch (error.response.status) {
        case 400:
          errorMessage = '请求错误(400)'
          break
        case 401:
          errorMessage = '未授权，请重新登录(401)'
          break
        case 403:
          errorMessage = '拒绝访问(403)'
          break
        case 404:
          errorMessage = '请求出错(404)'
          break
        case 408:
          errorMessage = '请求超时(408)'
          break
        case 500:
          errorMessage = '服务器错误(500)'
          break
        case 501:
          errorMessage = '服务未实现(501)'
          break
        case 502:
          errorMessage = '网络错误(502)'
          break
        case 503:
          errorMessage = '服务不可用(503)'
          break
        case 504:
          errorMessage = '网络超时(504)'
          break
        case 505:
          errorMessage = 'HTTP版本不受支持(505)'
          break
        default:
          errorMessage = `连接出错(${error.response.status})`
      }
    } else if (error.request) {
      errorMessage = '连接到服务器失败'
    } else {
      errorMessage = error.message
    }
    showToast(errorMessage)
    return Promise.reject(error)
  },
)

export default service
